﻿using UnityEngine;

namespace QxFramework.Core
{
    /// <summary>
    /// 所有流程的基类。
    /// </summary>
    public abstract class ProcedureBase
    {
        /// <summary>
        /// 默认UI
        /// </summary>
        protected UIBase UI;

        /// <summary>
        /// 默认消息队列。
        /// </summary>
        protected IMessageQueue MessageQueue;

        /// <summary>
        /// 程序初始化时执行，在打开程序时会完成所有流程初始化。
        /// </summary>
        public virtual void OnInit()
        {
        }

        /// <summary>
        ///当进入该流程时执行。
        /// </summary>
        public virtual void OnEnter()
        {
        }

        /// <summary>
        /// 每次更新时执行。
        /// </summary>
        /// <param name="elapseSeconds">流逝时间，以秒为单位。</param>
        public virtual void OnUpdate(float elapseSeconds)
        {
        }

        /// <summary>
        /// 每次物理更新时执行。
        /// </summary>
        /// <param name="elapseSeconds">流逝时间，以秒为单位。</param>
        public virtual void OnFixedUpdate(float elapseSeconds)
        {
        }

        /// <summary>
        /// 每次离开这个流程时执行。
        /// </summary>
        public virtual void OnLeave()
        {
            ReleaseDefault();
        }

        /// <summary>
        /// 程序退出时执行，在程序退出时会完成所有流程初始化。
        /// </summary>
        public virtual void OnDestroy()
        {
        }

        /// <summary>
        /// 设置默认的UI。
        /// </summary>
        /// <typeparam name="TEventType">The type of the event type.</typeparam>
        /// <param name="ui">The UI.</param>
        /// <returns></returns>
        protected IMessageQueue SetDefault<TEventType>(string ui = null) where TEventType : struct
        {
            MessageQueue = MessageManager.Instance.Get<TEventType>();
            if (ui != null)
            {
                UI = UIManager.Instance.Open(ui);
            }
            return MessageQueue;
        }

        /// <summary>
        /// 释放默认的UI和消息队列。
        /// </summary>
        private void ReleaseDefault()
        {
            if (MessageQueue != null)
            {
                MessageManager.Instance.Dispose(MessageQueue);
            }
            if (UI != null)
            {
                UIManager.Instance.Close(UI);
            }
        }
    }
}